#ifndef DSPSIMULATOR_INTERRUPTHANDLE_H
#define DSPSIMULATOR_INTERRUPTHANDLE_H

#include <vector>
#include "dspMachine.h"
#include "interrupt.h"
#include "dspRegisterInfo.h"

class InterruptHandle {
private:
    std::shared_ptr<DspMachine> m_dspMachine;

    /**
     * 获取当前激活的中断类型，按优先级从高到低排序
     * @return 当前激活的中断类型
     */
    std::vector<InterruptKind> getActiveInterrupt() const;

    /**
     * @return 获取IER中未被屏蔽的中断类型
     */
    std::vector<InterruptKind> getEnableInterrupt() const;


    /**
     * 获取ICR中需要周期性清除的中断类型
     * @return 需要周期性清除的中断类型
     */
    std::vector<InterruptKind> getClearFlags() const;

    /**
     * 获取ISR中需要周期性设置的中断类型
    * @return 需要周期性设置的中断类型
    */
    std::vector<InterruptKind> getSetFlags() const;

    /**
     * 获取中断的返回地址
     * @return
     */
    u32 getReturnAddress() const;

    /**
     * 是否允许所有中断，如果为false，表示禁止除不可屏蔽中断及reset中断以外的所有中断
     */
    bool isEnableGlobalInterrupt() const;

    /**
     * 更新ISPT的HPEINT字段，数值为最高优先级的中断
     */
    void updateHPEINT(InterruptKind interruptKind) const;

    /**
     * 获取当前需要处理的中断的中断服务表（interrupt service table）的起始内存地址
     */
    u32 getStartAddressOfIST() const;

    /**
     * 清除中断允许位
     */
    void clearInterruptEnable(InterruptKind kind) const;

    /**
     * 清除中断状态位
     */
    void clearInterruptState(InterruptKind kind) const;
public:
    InterruptHandle(std::shared_ptr<DspMachine> dspMachine) :
            m_dspMachine(dspMachine) {}

    ~InterruptHandle() = default;

    bool handleInterrupt();
};

#endif //DSPSIMULATOR_INTERRUPTHANDLE_H